home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 416_01 / dumpns / dump.c < prev    next >
C/C++ Source or Header  |  1994-02-14  |  4KB  |  177 lines

  1. /* Dump - display file in binary decimal ASCII or hex */
  2. /* Microsoft C */
  3. /******************************************************
  4. Nigel Salt
  5. 25 Lower Station Rd
  6. Crayford
  7. Kent
  8. DA1 3PY
  9. UK
  10.  
  11. Phone +44 322 553260
  12.  
  13. Email nao@cix.complink.co.uk
  14. ******************************************************/
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <ctype.h>
  20. #define MAXWID 128
  21.  
  22. void pbin(char);
  23. void usage(void);
  24.  
  25. void main(argc,argv)
  26. int argc;
  27. char *argv[];
  28. {
  29.   unsigned long l,start=0,len=160,count=0,curoff=0;
  30.   int i,j,width=8,inch;
  31.   char *cpres;
  32.   char pic[5];
  33.   enum {decimal,hex} offtyp=decimal;
  34.   FILE *f;
  35.   static unsigned char buff[MAXWID];
  36.  
  37.   if (argv[1][0]=='?') usage();
  38.  
  39.   cpres=strcpy(pic,"ha");
  40.  
  41.   for (i=1;i<argc && argv[i][0]=='-';i++)
  42.     {
  43.     switch (tolower(argv[i][1]))
  44.       {
  45.       case 'o':
  46.         if (argv[i][2]=='h') 
  47.           {
  48.           offtyp=hex;
  49.           }
  50.         else
  51.           {
  52.           offtyp=decimal;
  53.           }
  54.         break;
  55.       case 's':
  56.         start=atol(&argv[i][2]);
  57.         break;
  58.       case 'w':
  59.         width=atoi(&argv[i][2]);
  60.         if (width==0) width=8;
  61.         if (width>MAXWID) width=MAXWID;
  62.         break;
  63.       case 'l':
  64.         len=atol(&argv[i][2]);
  65.         if (len==0) len=160;
  66.         break;
  67.       case 'p':
  68.         for (j=0;j<4 && argv[i][2+j]!='\0';j++)
  69.           pic[j]=argv[i][2+j];
  70.         pic[j]='\0';
  71.         break;
  72.       default:
  73.         printf("\nUnknown switch: '%s'",argv[i]);
  74.         usage();
  75.       }
  76.     }
  77.  
  78.   if (i==argc)
  79.     {
  80.     f=stdin;
  81.     }
  82.   else 
  83.     {
  84.     f=fopen(argv[i],"rb");
  85.     if (f==NULL)
  86.       {
  87.       printf("\nCannot open '%s'",argv[i]);
  88.       usage();
  89.       }
  90.     }
  91.  
  92.   for (l=0;l<start;l++)  
  93.     inch=getc(f);
  94.  
  95.   printf("\nDump of file '%s'",argv[i]);
  96.  
  97.   for (l=0;l<len && inch!=EOF; l+=width)
  98.     {
  99.     if (offtyp==hex)
  100.       {
  101.       printf("\n%8.lX: ",start+l);
  102.       }
  103.     else
  104.       {
  105.       printf("\n%10.ld: ",start+l);
  106.       }
  107.     for (j=0;j<width;j++)
  108.       {
  109.       inch=getc(f);
  110.       buff[j]=(char)inch;
  111.       }
  112.     for (i=0;i<4 && pic[i];i++)
  113.       {
  114.       for (j=0;j<width;j++)
  115.         {
  116.         switch (pic[i])
  117.           {
  118.           case 'a':
  119.             printf("%c",(isprint(buff[j])?buff[j]:' '));
  120.             if (j==(width-1)) printf(" ");
  121.             break;
  122.           case 'h':
  123.             printf("%.2X ",buff[j]);
  124.             break;
  125.           case 'd':
  126.             printf("%3.d ",buff[j]);
  127.             break;
  128.           case 'b':
  129.             pbin(buff[j]);
  130.             printf(" ");
  131.             break;
  132.           default:
  133.             printf("\nUnknown option '%c' in -p switch",pic[i]);
  134.             usage();
  135.           }         /* End of -p switch */
  136.         }           /* End of pic loop */
  137.       }             /* End of print line for loop */
  138.     }               /* End of dump for loop */
  139.   printf("\n");
  140.   exit(0);
  141. }                   /* End of dump prog */
  142.  
  143. void pbin(x)
  144. char x;
  145. {
  146.   printf("%c",(x&0x0080?'1':'0'));
  147.   printf("%c",(x&0x0040?'1':'0'));
  148.   printf("%c",(x&0x0020?'1':'0'));
  149.   printf("%c",(x&0x0010?'1':'0'));
  150.   printf("%c",(x&0x0008?'1':'0'));
  151.   printf("%c",(x&0x0004?'1':'0'));
  152.   printf("%c",(x&0x0002?'1':'0'));
  153.   printf("%c",(x&0x0001?'1':'0'));
  154. }
  155.  
  156. void usage()
  157. {
  158.   printf("\ndump - displays file in binary decimal hex or ASCII");
  159.   printf("\nUSAGE");
  160.   printf("\ndump [-switch] [-switch] filename");
  161.   printf("\nSWITCHES");
  162.   printf("\n-od display offset in decimal");
  163.   printf("\n-oh display offset in hex");
  164.   printf("\n-p  set up picture - any combination of");
  165.   printf("\n    a ASCII");
  166.   printf("\n    b binary");
  167.   printf("\n    d decimal");
  168.   printf("\n    h hex    ");
  169.   printf("\n-wn display n bytes per line");
  170.   printf("\n-sn start at byte number n");
  171.   printf("\n-ln display n bytes");
  172.   printf("\nDEFAULT ");
  173.   printf("\ndump -od -pha -w8 -s0 -l160");
  174.   exit(1);
  175. }
  176.  
  177.